﻿using System.Collections.Immutable;
using DimensionsHelper.LanguageService.Syntax;

namespace DimensionsHelper.LanguageService.Symbols;

/// <summary>
///     可绑定类型的符号接口。包含函数定义、属性定义、方法定义等。
/// </summary>
public interface IBindableSymbol : ITypeSymbol
{
    /// <summary>
    ///     如果绑定的符号可能是空，此属性为<see langword="true" />
    /// </summary>
    bool IsNullable { get; }


    /// <summary>
    ///     直接包含此符号的类或接口符号
    /// </summary>
    new ITypeSymbol? ContainingSymbol { get; }


    /// <summary>
    ///     获取绑定的类型符号
    /// </summary>
    ITypeSymbol BindingSymbol { get; }


    /// <summary>
    ///     获取所有声明此符号的语法节点列表.
    /// </summary>
    ImmutableArray<IDeclaration> GetDeclarations();


    /// <summary>
    ///     查找指定名称的符号定义，如果<paramref name="searchParent" />是<see langword="true" />，
    ///     将向父级符号表依次查找符号。
    /// </summary>
    public ITypeSymbol? LookupNamedMember(string name, bool searchParent);


    /// <summary>
    ///     使用<see cref="Identifier" />标识符查找指定名称的符号。
    ///     如果<paramref name="identifier" />带有<see cref="SyntaxNodeFlags.OptionGlobalVariables" />，
    ///     会向父级符号表依次查找符号。
    /// </summary>
    public ITypeSymbol? LookupNamedMember(Identifier identifier);
}